<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<style>
body {
  font-family: Helvetica, arial, sans-serif;
  font-size: 14px;
  line-height: 1.6;
  padding-top: 10px;
  padding-bottom: 10px;
  background-color: white;
  padding: 30px; }

body > *:first-child {
  margin-top: 0 !important; }
body > *:last-child {
  margin-bottom: 0 !important; }

a {
  color: #4183C4; }
a.absent {
  color: #cc0000; }
a.anchor {
  display: block;
  padding-left: 30px;
  margin-left: -30px;
  cursor: pointer;
  position: absolute;
  top: 0;
  left: 0;
  bottom: 0; }

h1, h2, h3, h4, h5, h6 {
  margin: 20px 0 10px;
  padding: 0;
  font-weight: bold;
  -webkit-font-smoothing: antialiased;
  cursor: text;
  position: relative; }

h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, h5:hover a.anchor, h6:hover a.anchor {
  background: url() no-repeat 10px center;
  text-decoration: none; }

h1 tt, h1 code {
  font-size: inherit; }

h2 tt, h2 code {
  font-size: inherit; }

h3 tt, h3 code {
  font-size: inherit; }

h4 tt, h4 code {
  font-size: inherit; }

h5 tt, h5 code {
  font-size: inherit; }

h6 tt, h6 code {
  font-size: inherit; }

h1 {
  font-size: 28px;
  color: black; }

h2 {
  font-size: 24px;
  border-bottom: 1px solid #cccccc;
  color: black; }

h3 {
  font-size: 18px; }

h4 {
  font-size: 16px; }

h5 {
  font-size: 14px; }

h6 {
  color: #777777;
  font-size: 14px; }

p, blockquote, ul, ol, dl, li, table, pre {
  margin: 15px 0; }

hr {
  background: transparent url() repeat-x 0 0;
  border: 0 none;
  color: #cccccc;
  height: 4px;
  padding: 0;
}

body > h2:first-child {
  margin-top: 0;
  padding-top: 0; }
body > h1:first-child {
  margin-top: 0;
  padding-top: 0; }
  body > h1:first-child + h2 {
    margin-top: 0;
    padding-top: 0; }
body > h3:first-child, body > h4:first-child, body > h5:first-child, body > h6:first-child {
  margin-top: 0;
  padding-top: 0; }

a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 {
  margin-top: 0;
  padding-top: 0; }

h1 p, h2 p, h3 p, h4 p, h5 p, h6 p {
  margin-top: 0; }

li p.first {
  display: inline-block; }
li {
  margin: 0; }
ul, ol {
  padding-left: 30px; }

ul :first-child, ol :first-child {
  margin-top: 0; }

dl {
  padding: 0; }
  dl dt {
    font-size: 14px;
    font-weight: bold;
    font-style: italic;
    padding: 0;
    margin: 15px 0 5px; }
    dl dt:first-child {
      padding: 0; }
    dl dt > :first-child {
      margin-top: 0; }
    dl dt > :last-child {
      margin-bottom: 0; }
  dl dd {
    margin: 0 0 15px;
    padding: 0 15px; }
    dl dd > :first-child {
      margin-top: 0; }
    dl dd > :last-child {
      margin-bottom: 0; }

blockquote {
  border-left: 4px solid #dddddd;
  padding: 0 15px;
  color: #777777; }
  blockquote > :first-child {
    margin-top: 0; }
  blockquote > :last-child {
    margin-bottom: 0; }

table {
  padding: 0;border-collapse: collapse; }
  table tr {
    border-top: 1px solid #cccccc;
    background-color: white;
    margin: 0;
    padding: 0; }
    table tr:nth-child(2n) {
      background-color: #f8f8f8; }
    table tr th {
      font-weight: bold;
      border: 1px solid #cccccc;
      margin: 0;
      padding: 6px 13px; }
    table tr td {
      border: 1px solid #cccccc;
      margin: 0;
      padding: 6px 13px; }
    table tr th :first-child, table tr td :first-child {
      margin-top: 0; }
    table tr th :last-child, table tr td :last-child {
      margin-bottom: 0; }

img {
  max-width: 100%; }

span.frame {
  display: block;
  overflow: hidden; }
  span.frame > span {
    border: 1px solid #dddddd;
    display: block;
    float: left;
    overflow: hidden;
    margin: 13px 0 0;
    padding: 7px;
    width: auto; }
  span.frame span img {
    display: block;
    float: left; }
  span.frame span span {
    clear: both;
    color: #333333;
    display: block;
    padding: 5px 0 0; }
span.align-center {
  display: block;
  overflow: hidden;
  clear: both; }
  span.align-center > span {
    display: block;
    overflow: hidden;
    margin: 13px auto 0;
    text-align: center; }
  span.align-center span img {
    margin: 0 auto;
    text-align: center; }
span.align-right {
  display: block;
  overflow: hidden;
  clear: both; }
  span.align-right > span {
    display: block;
    overflow: hidden;
    margin: 13px 0 0;
    text-align: right; }
  span.align-right span img {
    margin: 0;
    text-align: right; }
span.float-left {
  display: block;
  margin-right: 13px;
  overflow: hidden;
  float: left; }
  span.float-left span {
    margin: 13px 0 0; }
span.float-right {
  display: block;
  margin-left: 13px;
  overflow: hidden;
  float: right; }
  span.float-right > span {
    display: block;
    overflow: hidden;
    margin: 13px auto 0;
    text-align: right; }

code, tt {
  margin: 0 2px;
  padding: 0 5px;
  white-space: nowrap;
  border: 1px solid #eaeaea;
  background-color: #f8f8f8;
  border-radius: 3px; }

pre code {
  margin: 0;
  padding: 0;
  white-space: pre;
  border: none;
  background: transparent; }

.highlight pre {
  background-color: #f8f8f8;
  border: 1px solid #cccccc;
  font-size: 13px;
  line-height: 19px;
  overflow: auto;
  padding: 6px 10px;
  border-radius: 3px; }

pre {
  background-color: #f8f8f8;
  border: 1px solid #cccccc;
  font-size: 13px;
  line-height: 19px;
  overflow: auto;
  padding: 6px 10px;
  border-radius: 3px; }
  pre code, pre tt {
    background-color: transparent;
    border: none; }

sup {
    font-size: 0.83em;
    vertical-align: super;
    line-height: 0;
}
* {
	-webkit-print-color-adjust: exact;
}
@media screen and (min-width: 914px) {
    body {
        width: 854px;
        margin:0 auto;
    }
}
@media print {
	table, pre {
		page-break-inside: avoid;
	}
	pre {
		word-wrap: break-word;
	}
}
</style>
<title>错误与日志</title>

</head>
<body>
<h1>错误与日志</h1>

<ul>
<li><a href="#error-detail">错误信息</a></li>
<li><a href="#handling-errors">错误处理</a></li>
<li><a href="#http-exceptions">HTTP异常</a></li>
<li><a href="#handling-404-errors">处理404错误</a></li>
<li><a href="#logging">日志</a></li>
</ul>


<p><a name="error-detail"></a></p>

<h2>错误信息</h2>

<p>默认情况下，错误信息在应用程序中是开启的，这意味着当一个错误发生的时候，您会看到到错误代码跟踪和错误信息显示在出错页上。您可以通过设置 <code>app/config/app.php</code> 文件中的 <code>debug</code> 选项为 <code>false</code> 来关闭错误信息。<strong>强烈推荐您在生产环境下关闭错误信息。</strong></p>

<p><a name="handling-errors"></a></p>

<h2>错误处理</h2>

<p>默认情况下，<code>app/start/global.php</code> 文件包含一个针对所有异常的错误处理器：</p>

<pre><code>App::error(function(Exception $exception)
{
    Log::error($exception);
});
</code></pre>

<p>这是一个最基础的错误处理器。但是您可以根据需求指定更多的处理器。错误处理器根据它们能够处理的异常进行调用。比如，您可以创建一个只处理 <code>RuntimeException</code> 异常的错误处理器：</p>

<pre><code>App::error(function(RuntimeException $exception)
{
    // Handle the exception...
});
</code></pre>

<p>如果一个异常处理器返回一个响应，响应将被发送至浏览器，其他异常处理器将不会被调用：</p>

<pre><code>App::error(function(InvalidUserException $exception)
{
    Log::error($exception);

    return 'Sorry! Something is wrong with this account!';
});
</code></pre>

<p>为了监听 PHP 的 fatal 错误，您可以使用 <code>App::fatal</code> 函数：</p>

<pre><code>App::fatal(function($exception)
{
    //
});
</code></pre>

<p><a name="http-exceptions"></a></p>

<h2>HTTP异常</h2>

<p>关于 HTTP 异常，指的是在客户端请求时发生的错误。这有可能是一个页面没有找到 (404)，一个没有通过认证的错误 (401) 甚至是一个500错误。为了返回这样一个响应，可以使用如下方法：</p>

<pre><code>App::abort(404, 'Page not found');
</code></pre>

<p>第一个参数是 HTTP 状态码，紧接着是一个您希望显示的定制的消息。</p>

<p>为了引发一个没有通过认证的401异常，使用如下方法：</p>

<pre><code>App::abort(401, 'You are not authorized.');
</code></pre>

<p>这些异常可以在请求生命周期的任何阶段被处理。</p>

<p><a name="handling-404-errors"></a></p>

<h2>处理404错误</h2>

<p>您可以注册一个异常处理器处理您应用程序中所有的 "404 Not Found" 错误，允许您返回定制的404错误页面：</p>

<pre><code>App::missing(function($exception)
{
    return Response::view('errors.missing', array(), 404);
});
</code></pre>

<p><a name="logging"></a></p>

<h2>日志</h2>

<p>Laravel 的日志工具提供了强大的 <a href="http://github.com/seldaek/monolog">Monolog</a> 的简单的封装。默认情况下，Laravel 配置成为您的应用产生每天的日志，这些文件被存放在 <code>app/storage/logs</code> 目录下。您可以像下面这样向日志中写入信息：</p>

<pre><code>Log::info('This is some useful information.');

Log::warning('Something could be going wrong.');

Log::error('Something is really going wrong.');
</code></pre>

<p>日志工具根据在 <a href="http://tools.ietf.org/html/rfc5424">RFC 5424</a> 定义了7个日志等级，分别是： <strong>debug</strong>, <strong>info</strong>, <strong>notice</strong>, <strong>warning</strong>, <strong>error</strong>, <strong>critical</strong> 以及 <strong>alert</strong>。</p>

<p>Monolog 有许多其他的处理器您可以用来产生日志，如果您愿意，您可以获取 Laravel 使用的底层的 Monolog 实例：</p>

<pre><code>$monolog = Log::getMonolog();
</code></pre>

<p>您也可以注册一个事件抓取传递给日志工具的所有消息：</p>

<p><strong>注册一个日志监听器</strong></p>

<pre><code>Log::listen(function($level, $message, $context)
{
    //
});
</code></pre>
</body>
</html>